package com.xlf.controller.admin;


import com.xlf.domain.Type;

import com.xlf.service.TypeService;

import com.xlf.utils.ResponseResult;
import com.xlf.vo.IsDisableVO;
import com.xlf.vo.QueryPageBean;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.ArrayList;

/**
 * 商品分类控制层
 */

@RestController
@RequestMapping("/type")
@PreAuthorize("hasAuthority('type')")
@Tag(name = "分类管理", description = "商品分类的增删改查及相关管理操作")
public class TypeController {

    @Resource
    TypeService typeService;

    /**
     * 后台条件查询分类数据，支持分页、时间区间、分类/标签id查询
     * @param queryPageBean 查询条件对象
     * @return              查询到的数据
     */
    @PreAuthorize("hasAuthority('type:typeList')")
    @PostMapping("/typeList")
    @Operation(summary = "条件分页查询分类", description = "根据多种条件分页查询分类数据，支持时间区间和ID筛选")
    public ResponseResult adminType(@RequestBody QueryPageBean queryPageBean) {
        return ResponseResult.success("获取后台分类数据成功", typeService.adminType(queryPageBean));
    }


    /**
     * 新增/修改分类，通过有没有id来看是新增还是修改
     * @param type  分类对象
     * @return      执行结果
     */
    @CacheEvict(value = "clientCacheMenuList")
    @PreAuthorize("hasAuthority('type:saveOrUpdate')")
    @PostMapping("/saveOrUpdate")
    @Operation(summary = "新增或修改分类", description = "根据ID是否存在执行新增或修改分类操作")
    public ResponseResult saveOrUpdateType(@RequestBody Type type) {
        boolean flag = typeService.saveOrUpdate(type);
        if (flag)
            return ResponseResult.success("添加或更改分类成功");
        return ResponseResult.error("添加失败，要添加的分类已存在");
    }


    /**
     * 根据id列表删除分类
     * @param typeIdList    分类id列表
     * @return              执行结果
     */
    @CacheEvict(value = "clientCacheMenuList")
    @PreAuthorize("hasAuthority('type:delete')")
    @DeleteMapping("/delete")
    @Operation(summary = "批量删除分类", description = "根据ID列表批量删除分类，支持一次性删除多个")
    public ResponseResult delete(@RequestBody ArrayList<Long> typeIdList) {
        typeService.removeByIds(typeIdList);
        return ResponseResult.success("删除分类成功");
    }

    /**
     * 修改类型状态
     * @param isDisableVO   菜单项显示对象
     * @return              执行结果
     */
    @Operation(summary = "修改分类状态", description = "启用或禁用分类，影响分类在前端的显示状态")
    @PostMapping("/typeIsDisable")
    public ResponseResult typeIsDisable(@RequestBody IsDisableVO isDisableVO){
        typeService.updateStatus(isDisableVO);
        return ResponseResult.success("修改状态成功");
    }
}
